package cn.oracle;

/**
 * 1、如果期望克隆某个类的对象，则该类必须实现 java.lang.Cloneable 接口
 *      否则会抛出 java.lang.CloneNotSupportedException
 *      
 * 2、java.lang.Cloneable 接口 中没有定义任何方法，可以理解为某个类实现该接口就是做了一个标记
 * 
 * 3、浅克隆 : 仅仅克隆当前对象本身，而当前对象关联的其它对象是不克隆的
 */
public class Monkey extends Object implements Cloneable {
	
	private String name ;
	private int age ;
	
	private Master master ;

	public Monkey(String name , int age , Master master ) {
		super();
		this.name = name;
		this.age = age ;
		this.master = master ;
	}
	
	// Object 类中的 clone 方法: protected native Object clone() throws CloneNotSupportedException ;
	@Override
	public Object clone() throws CloneNotSupportedException { 
		// 子类重写后的方法 的 访问修饰符 的范围 不能比父类相应方法的 权限小
		return super.clone() ; // 仍然是调用由 Object 提供的 clone 支持 ( 一定要调用 )
	}

	public static void main(String[] args) throws CloneNotSupportedException {
		
		Master a = new Master( "唐三藏" );
		
		Monkey m = new Monkey( "孙悟空"  , 1000 , a );
		
		
		Object o = m.clone();
		
		System.out.println( m == o ); // false
		
		Monkey n = (Monkey) o ;
		System.out.println( m == n ); // false
		
		System.out.println( "~ ~ ~ ~ ~ ~ ~" );
		
		// == 比较两个变量所存储的值
		System.out.println( m.name == n.name ); // true
		System.out.println( m.age == n.age ); // true : 比较基本数据类型的值
		System.out.println( m.master == n.master ); // true : 说明内部关联的对象没有被克隆
		
	}

}
